module crc8_maxim (
    input wire [7:0] data_in,
    input wire clk,
    input wire reset,
    output wire [7:0] crc_out
);

    reg [7:0] c;
    reg [7:0] temp;

    always @(posedge clk or posedge reset) begin
        if (reset) begin
            c <= 8'b0;
            temp <= 8'b0;
        end else begin
            temp[0] = data_in[2] ^ data_in[4] ^ data_in[5] ^ c[2] ^ c[4] ^ c[5];
            temp[1] = data_in[0] ^ data_in[3] ^ data_in[5] ^ data_in[6] ^ c[0] ^ c[3] ^ c[5] ^ c[6];
            temp[2] = data_in[0] ^ data_in[1] ^ data_in[4] ^ data_in[6] ^ data_in[7] ^ c[0] ^ c[1] ^ c[4] ^ c[6] ^ c[7];
            temp[3] = data_in[0] ^ data_in[1] ^ data_in[4] ^ data_in[7] ^ c[0] ^ c[1] ^ c[4] ^ c[7];
            temp[4] = data_in[0] ^ data_in[1] ^ data_in[4] ^ c[0] ^ c[1] ^ c[4];
            temp[5] = data_in[1] ^ data_in[2] ^ data_in[5] ^ c[1] ^ c[2] ^ c[5];
            temp[6] = data_in[0] ^ data_in[2] ^ data_in[3] ^ data_in[6] ^ c[0] ^ c[2] ^ c[3] ^ c[6];
            temp[7] = data_in[1] ^ data_in[3] ^ data_in[4] ^ data_in[7] ^ c[1] ^ c[3] ^ c[4] ^ c[7];
            c <= temp;
        end
    end

    assign crc_out = c;

endmodule
